package com.yuw.annotation;

import java.lang.annotation.Annotation;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Date;

import org.junit.Test;

public class TestDriver {

	@Test
	public void test02() {
		try {
			// 创建Student类的一个实例对象
			Student stu0 = new Student();
			// 解析Student类中的注解信息，参与程序的运行
			// 获取Class对象
			Class<Student> clazz = Student.class;


			// 获取Method工具类
			// 第一个参数是方法名，第二个参数是该方法对应的形参类型的列表
			Method method = clazz.getDeclaredMethod("doStuding");
			
			// 通过Method获取该方法上所使用的所有注解对象
			MyAnnotation ma = method.getDeclaredAnnotation(MyAnnotation.class);
			// 进行业务逻辑处理
			// 执行该方法对象，将注解的参数值参与运行
			
			method.invoke(stu0);
			
			System.out.println("学些的课程有：");
			String[] arrs = ((MyAnnotation) ma).myCources();
			for (String str : arrs) {
				System.out.print("  "+str);
			}
			//System.out.println(((MyAnnotation) an).myName());
			System.out.println();
			
			
//			Object obj = method.invoke(stu0, "天津西青", new Date());
//			System.out.println("反射执行方法完成，方法结果：" + obj);

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	
	@Test
	public void test01() {
		try {
			// 创建Student类的一个实例对象
			Student stu0 = new Student();
			// 解析Student类中的注解信息，参与程序的运行
			// 获取Class对象
			Class<Student> clazz = Student.class;


			// 获取Method工具类
			// 第一个参数是方法名，第二个参数是该方法对应的形参类型的列表
			Method method = clazz.getDeclaredMethod("doStuding");
			
			// 通过Method获取该方法上所使用的所有注解对象
			// MyAnnotation ma = clazz.getDeclaredAnnotation(MyAnnotation.class);
			Annotation[] ans = method.getAnnotations();
			// 迭代遍历所有的注解对象，找到需要处理的注解进行业务逻辑处理
			for (Annotation an : ans) {
				if (an instanceof MyAnnotation) {
					// 进行业务逻辑处理
					// 执行该方法对象，将注解的参数值参与运行
					
					method.invoke(stu0);
					
					System.out.println("学些的课程有：");
					String[] arrs = ((MyAnnotation) an).myCources();
					for (String str : arrs) {
						System.out.print("  "+str);
					}
					//System.out.println(((MyAnnotation) an).myName());
					System.out.println();
				}
			}
			
			
//			Object obj = method.invoke(stu0, "天津西青", new Date());
//			System.out.println("反射执行方法完成，方法结果：" + obj);

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}
